/***********************************************************
 * 文件名称： subMusic.js
 * 内容摘要： 触摸元素或者点击元素时发出音效
 * 其他说明： 第一个插件,尽量用已知的规范去书写插件
 * 完成日期： 2018/08/13
 * 当前版本： 1.0.0.0
 * 采   用： 原生js,es6
 * 作   者： 史莱姆[slm]
 * 企   鹅： 478889187
/*
 ***********************************************************
 *                      接  口  信  息
 *
 *  被动式：
 *       data-submusic : 音乐路径
 *       data-play     : 几秒后播放[单位:毫秒]
 *       data-stop     : 几秒后暂停[单位:毫秒]
 *       data-playstop : 播放后几秒后暂停[单位:毫秒]
 *       data-on       : 播放时音效逐步放大淡入效果[单位:毫秒]
 *       data-out      : 即将播放结束时淡出效果[单位:毫秒]
 *       data-volume   : 播放时的音量[值不能为空]
 *       data-count    : 可被触发的次数[数值]
 *  主动式:
 *       el            : 元素[类/ID/标签]
 *       src           : 音乐路径
 ***********************************************************
 *                      修  改  记  录
 */
;((win , doc) => {
    console.log('Loading subMusic Plugin ...');
    AUDIO = doc.createElement('audio');
    doc.body.appendChild(AUDIO);
        //全部计时器
    let c1 = c2 = c3 = c4 = c5 = c6 = null,
        //部分公共属性
        Passive = true,
        _data   = null,
        _play   = false;

    //主动式触发
    /*win.subMusic = (data,callback) => {
        if(data.el && /^[#\.]/.test(data.el) && (el = doc.querySelector(data.el))) {
            if(data.src) {
                data.volume = data.volume || 1;
                data.submusic = data.src;
                _data = data;
                if(!data.mouseover) {
                    el.onclick = e => {
                        subMusicEvent(e,1);
                        if(callback) callback(e);
                    }
                } else {
                    //el.addEventListener('mouseover',subMusicEvent);
                    // el.addEventListener('touchstart',subMusicEvent);
                    el.onmouseover = e => {
                        subMusicEvent(e,1);
                        if(callback) callback(e);
                    }
                }
            } else console.error(`[${data.el}]元素中(src:${data.src})错误!`);
        } else console.error(`[${data.el}]元素获取失败[关键词为空/不能为标签名/元素不存在]!`);

        //返回部分方法
        return {
            //关闭被动式触发
            closePassive: function () {
                Passive = false;
            }
        };
    }*/

    //被动式触发
    doc.body.addEventListener('click',subMusicEvent);
    doc.body.addEventListener('mouseover',subMusicEvent);
    AUDIO.addEventListener('pause',e => {
        _play = false;
    });

    function subMusicEvent(e,zd = false){
        if(!Passive && zd) return;
        let Element = e.target;
        if((data = _data || Element.dataset) && data.submusic) {
            if(!(
                e.type == 'mouseover'  && data.mouseover  ||
                e.type == 'touchstart' && data.touchstart ||
                e.type == 'click' && e.type != 'mouseover' && e.type != 'mouseover'
            )) return;
            if(data.count) {
                if(data.count > 0) {
                    Element.dataset.count --;
                } else return;
            }
            //防止重复播放同一首歌的bug
            if(`http:${data.submusic}` == AUDIO.src && _play) return;
            AUDIO.pause();
            clearTimeout(c1);
            clearInterval(c2);
            clearInterval(c3);
            clearTimeout(c4);
            clearTimeout(c5);
            clearTimeout(c6);
            AUDIO.src = data.submusic;
            _data = null;
        }
    }

    AUDIO.addEventListener('canplay',() => {
        AUDIO.volume = 1;
        //播放
        if(data.play) {
            c4 = setTimeout(() => {AUDIO.subPlay(data)},data.play);
        } else AUDIO.subPlay(data);
        //停止
        if(data.stop) {
            c5 = setTimeout(() => {AUDIO.pause()},data.stop);
        }
        //音量
        if(data.volume) {
            AUDIO.volume = data.volume;
        }
    });

    AUDIO.subPlay = data => {
        let duration = AUDIO.duration
        //播放开始后停止
        if(data.playstop){
            c6 = setTimeout(() => {AUDIO.pause()},data.playstop);
        }
        //淡入
        if(data.on) {
            maxVolume   = data.volume || 1;
            data.on     = data.on || 1000;

            if(duration * 1000 >= data.on) {
                let volume = AUDIO.volume = 0;
                c3 = setInterval(() => {
                    AUDIO.volume = volume += 0.1;
                    if(volume >= 0.9) clearInterval(c3);
                },data.on / 100);
            } else {
                throw `淡入时间超出总和时间! 总时长:${duration * 1000}ms 淡入时长:${data.on}ms`;
            }
        }
        //淡出
        if(data.out) {
            let maxVolume = data.volume || 1;
            data.out = data.out || 1000;
            if(duration * 1000 >= data.out) {
                c1 = setTimeout(() => {
                    c2 = setInterval(() => {
                        AUDIO.volume = maxVolume -= 0.1;
                        if(maxVolume <= 0.1) return clearInterval(c2);
                    },data.out / 100);
                },(duration * 1000) - data.out);
            } else {
                throw `淡出时间超出总和时间! 总时长:${duration * 1000}ms 淡出时长:${data.out}ms`;
            }
        }
        AUDIO.play();
        _play = true;
    }

})(window,document);